package com.ihy.service.impl;

import com.ihy.dao.hibernate.DaoSystem;
import com.ihy.domain.Systems;
import com.ihy.service.ServiceSystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * 系统信息表业务层
 * <p>
 * Transactional注解：
 * 描述单个方法或类的事务属性。
 * 在类级别，此注解作为默认值应用于声明类及其子类的所有方法。注意，它不适用于类层次结构上的祖先类；方法需要在本地重新声明，以便参与子类级别的注解。
 * <p>
 * Service注解：
 * 表示带注解的类是“服务”，最初设计定义为“作为独立于模型中的接口提供的操作，没有封装状态。”
 * 还可能表示类是“业务服务外观”（在核心J2EE模式意义上）或类似的东西。
 * 此注解充当@Component的专门化，允许通过类路径扫描自动检测实现类。
 * <p>
 * Autowired注解:
 * 将构造函数、字段、setter方法或config方法标记为由Spring的依赖注入工具自动连接。
 * Autowired注解是按照类型（byType）装配依赖对象，默认情况下它要求依赖对象必须存在，如果允许null值，可以设置它的required属性为false。
 * 如果我们想使用按照名称（byName）来装配，可以结合@Qualifier注解一起使用。(通过类型匹配找到多个candidate,在没有@Qualifier、@Primary注解的情况下，会使用对象名作为最后的fallback匹配)
 * <p>
 * Override注解：
 * 指示方法声明旨在重写父类型中的方法声明。如果使用此注解类型对方法进行注解，则需要编译器生成错误消息，除非至少满足以下条件之一：
 * 该方法重写或实现在父类型中声明的方法。
 * 该方法具有一个重写的签名，该签名等同于在对象中声明的任何公共方法的签名。
 */
@Service
@Transactional
public class ServiceSystemImpl implements ServiceSystem {

    @Autowired
    private DaoSystem daoSystem;

    /**
     * 查询方法
     *
     * @param id 系统表标识
     * @return 系统信息
     */
    @Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
    @Cacheable(key = "'systemIdIs'+#p0", value = "redisCacheTime")
    @Override
    public Systems query(Integer id) {
        return daoSystem.getById(id);
    }
}
